{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sentiment Analysis in Korean (using Naver Sentiment Movie Corpus)\n",
    "- Count-based method using Logistic Regression\n",
    "- Dataset source: https://github.com/e9t/nsmc\n",
    "- To install & use ```Mecab``` tagger in Windows, refer to https://groups.google.com/forum/#!topic/konlpy/SuMc8EkCT_M"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "from konlpy.tag import Mecab\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from collections import Counter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>document</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8112052</td>\n",
       "      <td>어릴때보고 지금다시봐도 재밌어요ㅋㅋ</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8132799</td>\n",
       "      <td>디자인을 배우는 학생으로, 외국디자이너와 그들이 일군 전통을 통해 발전해가는 문화산...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4655635</td>\n",
       "      <td>폴리스스토리 시리즈는 1부터 뉴까지 버릴께 하나도 없음.. 최고.</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>9251303</td>\n",
       "      <td>와.. 연기가 진짜 개쩔구나.. 지루할거라고 생각했는데 몰입해서 봤다.. 그래 이런...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10067386</td>\n",
       "      <td>안개 자욱한 밤하늘에 떠 있는 초승달 같은 영화.</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         id                                           document  label\n",
       "0   8112052                                어릴때보고 지금다시봐도 재밌어요ㅋㅋ      1\n",
       "1   8132799  디자인을 배우는 학생으로, 외국디자이너와 그들이 일군 전통을 통해 발전해가는 문화산...      1\n",
       "2   4655635               폴리스스토리 시리즈는 1부터 뉴까지 버릴께 하나도 없음.. 최고.      1\n",
       "3   9251303  와.. 연기가 진짜 개쩔구나.. 지루할거라고 생각했는데 몰입해서 봤다.. 그래 이런...      1\n",
       "4  10067386                        안개 자욱한 밤하늘에 떠 있는 초승달 같은 영화.      1"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_table(\"ratings.txt\")\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "mecab = Mecab(\"C:\\\\mecab\\\\mecab-ko-dic\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['어릴', '때', '보', '고', '지금', '다시', '봐도', '재밌', '어요', 'ㅋㅋ']"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mecab.morphs(df[\"document\"][0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of Reviews:  199992 199992\n",
      "Number of tokens:  3669567\n",
      "Number of unique tokens:  61039\n",
      "Wall time: 23 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "reviews = []\n",
    "labels = []\n",
    "all_tokens = []\n",
    "unique_tokens = dict()\n",
    "\n",
    "for i in range(len(df)):\n",
    "    try:\n",
    "        tokens = mecab.morphs(df[\"document\"][i])\n",
    "        reviews.append(tokens)\n",
    "        labels.append(df[\"label\"][i])\n",
    "        \n",
    "        all_tokens += tokens\n",
    "        for t in tokens:\n",
    "            if t in unique_tokens.keys():\n",
    "                unique_tokens[t] += 1\n",
    "            else:\n",
    "                unique_tokens[t] = 1\n",
    "    except:\n",
    "        pass\n",
    "    \n",
    "print(\"Number of Reviews: \", len(reviews), len(labels))\n",
    "print(\"Number of tokens: \", len(all_tokens))\n",
    "print(\"Number of unique tokens: \", len(unique_tokens))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def create_dictionary(unique_tokens, threshold):\n",
    "    token_to_idx = dict()\n",
    "    idx_to_token = dict()\n",
    "    unique_token_keys = list(unique_tokens.keys())\n",
    "    \n",
    "    j = 0\n",
    "    for i in range(len(unique_token_keys)):\n",
    "        if unique_tokens[unique_token_keys[i]] > threshold:\n",
    "            token_to_idx[unique_token_keys[i]] = j\n",
    "            idx_to_token[j] = unique_token_keys[i]\n",
    "            j += 1\n",
    "    \n",
    "    return token_to_idx, idx_to_token"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "425 425\n"
     ]
    }
   ],
   "source": [
    "token_to_idx, idx_to_token = create_dictionary(unique_tokens, 1000)\n",
    "\n",
    "print(len(token_to_idx), len(idx_to_token))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 1.97 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "for i in range(len(reviews)):\n",
    "    for j in range(len(reviews[i])):\n",
    "        if reviews[i][j] in token_to_idx.keys():\n",
    "            reviews[i][j] = token_to_idx[reviews[i][j]]\n",
    "        else:\n",
    "            reviews[i][j] = None\n",
    "            \n",
    "    reviews[i] = [x for x in reviews[i] if x != None]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of non-empty reviews:  197085\n"
     ]
    }
   ],
   "source": [
    "i = 0\n",
    "for r in reviews:\n",
    "    if len(r)!=0:\n",
    "        i += 1\n",
    "        \n",
    "print(\"Number of non-empty reviews: \", i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "197085 197085\n"
     ]
    }
   ],
   "source": [
    "X_data = []\n",
    "y_data = []\n",
    "\n",
    "for i in range(len(reviews)):\n",
    "    if len(reviews[i]) != 0:\n",
    "        temp = np.zeros(len(token_to_idx))\n",
    "        for t in reviews[i]:\n",
    "            temp[t] += 1\n",
    "        X_data.append(temp)\n",
    "        y_data.append(labels[i])\n",
    "        \n",
    "print(len(X_data), len(y_data))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(157668, 425) (39417, 425) (157668,) (39417,)\n"
     ]
    }
   ],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(np.asarray(X_data), np.asarray(y_data),test_size = 0.2)\n",
    "\n",
    "print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Logistic Regression with sklearn\n",
    "- Implementing LR using Scikit-learn\n",
    "- Cheap & Easy since using high-level API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf = LogisticRegression()\n",
    "clf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train Accuracy:  0.796788187838\n",
      "Test Accuracy:  0.797397062181\n"
     ]
    }
   ],
   "source": [
    "# Train & Test accuracy of 79%! not so bad!\n",
    "print(\"Train Accuracy: \", clf.score(X_train, y_train))\n",
    "print(\"Test Accuracy: \", clf.score(X_test, y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Logistic Regression with TF\n",
    "- Implementing LR using Tensorflow!\n",
    "- Much more complicated & long, but more low-level & able to try diverse settings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def create_lr_model(X_train, num_epochs = 100, alpha = 0.01, batch_size = 1000):\n",
    "    W = tf.Variable(tf.random_uniform([X_train.shape[1], 1]))\n",
    "    b = tf.Variable(tf.random_uniform([1]))\n",
    "    X = tf.placeholder(tf.float32, shape = [None, X_train.shape[1]])\n",
    "    Y = tf.placeholder(tf.float32)\n",
    "    hypo = tf.matmul(X, W) + b\n",
    "    cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=hypo, labels=Y))\n",
    "    adamOptimizer = tf.train.AdamOptimizer(tf.Variable(alpha))\n",
    "    train = adamOptimizer.minimize(cost)\n",
    "    \n",
    "    y_pred = tf.round(tf.sigmoid(hypo))\n",
    "    y_correct = tf.cast(tf.equal(y_pred, Y), dtype = tf.float32)\n",
    "    acc = tf.reduce_mean(y_correct)\n",
    "    return W, b, X, Y, hypo, cost, train, y_pred, y_correct, acc, num_epochs, batch_size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "W, b, X, Y, hypo, cost, train, y_pred, y_correct, acc, num_epochs, batch_size = \\\n",
    "                                create_lr_model(X_train, alpha = 0.001, num_epochs = 1000, batch_size = 10000)\n",
    "cost_trajectory = []\n",
    "train_accuracy = []\n",
    "test_accuracy = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cost for step 10: 4.152773857116699\n",
      "Cost for step 20: 4.106985092163086\n",
      "Cost for step 30: 3.9578464031219482\n",
      "Cost for step 40: 3.992523431777954\n",
      "Cost for step 50: 3.8413069248199463\n",
      "Cost for step 60: 3.759780168533325\n",
      "Cost for step 70: 3.763327121734619\n",
      "Cost for step 80: 3.7089858055114746\n",
      "Cost for step 90: 3.705281972885132\n",
      "Cost for step 100: 3.4980921745300293\n",
      "Cost for step 110: 3.372502088546753\n",
      "Cost for step 120: 3.3243536949157715\n",
      "Cost for step 130: 3.329185962677002\n",
      "Cost for step 140: 3.293125867843628\n",
      "Cost for step 150: 3.2670469284057617\n",
      "Cost for step 160: 3.17498517036438\n",
      "Cost for step 170: 3.0324788093566895\n",
      "Cost for step 180: 2.968329906463623\n",
      "Cost for step 190: 2.8926637172698975\n",
      "Cost for step 200: 2.8651695251464844\n",
      "Cost for step 210: 2.719136953353882\n",
      "Cost for step 220: 2.673672914505005\n",
      "Cost for step 230: 2.6563050746917725\n",
      "Cost for step 240: 2.5614233016967773\n",
      "Cost for step 250: 2.5558314323425293\n",
      "Cost for step 260: 2.4012701511383057\n",
      "Cost for step 270: 2.388608694076538\n",
      "Cost for step 280: 2.2770938873291016\n",
      "Cost for step 290: 2.2614264488220215\n",
      "Cost for step 300: 2.153254508972168\n",
      "Cost for step 310: 2.100558280944824\n",
      "Cost for step 320: 2.0330018997192383\n",
      "Cost for step 330: 1.9510042667388916\n",
      "Cost for step 340: 1.981006383895874\n",
      "Cost for step 350: 1.8612442016601562\n",
      "Cost for step 360: 1.8106240034103394\n",
      "Cost for step 370: 1.7428290843963623\n",
      "Cost for step 380: 1.656024694442749\n",
      "Cost for step 390: 1.6366654634475708\n",
      "Cost for step 400: 1.5880334377288818\n",
      "Cost for step 410: 1.4983352422714233\n",
      "Cost for step 420: 1.449858546257019\n",
      "Cost for step 430: 1.415726900100708\n",
      "Cost for step 440: 1.3577313423156738\n",
      "Cost for step 450: 1.319958209991455\n",
      "Cost for step 460: 1.2712310552597046\n",
      "Cost for step 470: 1.2215561866760254\n",
      "Cost for step 480: 1.2021617889404297\n",
      "Cost for step 490: 1.141202449798584\n",
      "Cost for step 500: 1.111228585243225\n",
      "Cost for step 510: 1.0582249164581299\n",
      "Cost for step 520: 1.0645959377288818\n",
      "Cost for step 530: 1.0260244607925415\n",
      "Cost for step 540: 0.989918053150177\n",
      "Cost for step 550: 0.9618144631385803\n",
      "Cost for step 560: 0.9431646466255188\n",
      "Cost for step 570: 0.9232725501060486\n",
      "Cost for step 580: 0.9089030623435974\n",
      "Cost for step 590: 0.8879082202911377\n",
      "Cost for step 600: 0.8806116580963135\n",
      "Cost for step 610: 0.8763230443000793\n",
      "Cost for step 620: 0.8586419224739075\n",
      "Cost for step 630: 0.8561521768569946\n",
      "Cost for step 640: 0.8415438532829285\n",
      "Cost for step 650: 0.8326911926269531\n",
      "Cost for step 660: 0.8298203945159912\n",
      "Cost for step 670: 0.8264333009719849\n",
      "Cost for step 680: 0.8210150599479675\n",
      "Cost for step 690: 0.8181377649307251\n",
      "Cost for step 700: 0.8165996074676514\n",
      "Cost for step 710: 0.8156499862670898\n",
      "Cost for step 720: 0.8130147457122803\n",
      "Cost for step 730: 0.8065387010574341\n",
      "Cost for step 740: 0.806304931640625\n",
      "Cost for step 750: 0.8046343922615051\n",
      "Cost for step 760: 0.8030385375022888\n",
      "Cost for step 770: 0.8007338643074036\n",
      "Cost for step 780: 0.7955663800239563\n",
      "Cost for step 790: 0.7957781553268433\n",
      "Cost for step 800: 0.7987390160560608\n",
      "Cost for step 810: 0.794112503528595\n",
      "Cost for step 820: 0.7938077449798584\n",
      "Cost for step 830: 0.7951211333274841\n",
      "Cost for step 840: 0.7917332649230957\n",
      "Cost for step 850: 0.7925833463668823\n",
      "Cost for step 860: 0.7860960960388184\n",
      "Cost for step 870: 0.7870060205459595\n",
      "Cost for step 880: 0.7863849401473999\n",
      "Cost for step 890: 0.7871077656745911\n",
      "Cost for step 900: 0.7821105718612671\n",
      "Cost for step 910: 0.7847086191177368\n",
      "Cost for step 920: 0.7804967164993286\n",
      "Cost for step 930: 0.7810630202293396\n",
      "Cost for step 940: 0.7801623344421387\n",
      "Cost for step 950: 0.7790200710296631\n",
      "Cost for step 960: 0.7742414474487305\n",
      "Cost for step 970: 0.7764526605606079\n",
      "Cost for step 980: 0.7741590142250061\n",
      "Cost for step 990: 0.7697320580482483\n",
      "Cost for step 1000: 0.7730680108070374\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.initialize_all_variables())\n",
    "    for i in range(num_epochs):\n",
    "        batch_idx = np.random.choice(len(X_train), size = batch_size)\n",
    "        batch_test_idx = np.random.choice(len(X_test), size = 3000)\n",
    "        batch_X_tr, batch_y_tr = X_train[batch_idx], y_train[batch_idx]\n",
    "        sess.run(train, feed_dict = {X: batch_X_tr, Y: batch_y_tr})\n",
    "        temp_cost = sess.run(cost, feed_dict = {X: batch_X_tr, Y: batch_y_tr})\n",
    "        temp_tr_acc = sess.run(acc, feed_dict = {X: batch_X_tr, Y: batch_y_tr})\n",
    "        batch_X_te, batch_y_te = X_test[batch_test_idx], y_test[batch_test_idx]\n",
    "        temp_te_acc = sess.run(acc, feed_dict = {X: batch_X_te, Y: batch_y_te})\n",
    "        if (i+1) % 10 == 0:\n",
    "            print(\"Cost for step {}: {}\".format(i+1, temp_cost))\n",
    "        \n",
    "        cost_trajectory.append(temp_cost)\n",
    "        train_accuracy.append(temp_tr_acc)\n",
    "        test_accuracy.append(temp_te_acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsYAAAFpCAYAAACfyu4TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8VUX+//HXBEIJIDV0kKIU6RJAwQIoCohrWXV1FUVX\nsa0dV13bivL96eqislZUVNBVxF6wIaCAgAQMSJOilAAGEkhISEJImN8fn4SbQCABkntvkvfz8biP\nMzNn7jmfe7F87jBnxnnvERERERGp6CJCHYCIiIiISDhQYiwiIiIighJjERERERFAibGIiIiICKDE\nWEREREQEUGIsIiIiIgIoMRYRERERAQ4jMXbOVXLO/eyc+7yQc/2dcynOubjc10MlG6aIiIiISOmq\nfBh9bwNWAMcc5Pws7/2wow9JRERERCT4ijVi7JxrDpwDvFq64YiIiIiIhEZxR4yfAf4B1DpEn77O\nuSXAJmCU937ZoS7YoEED36pVq2LeXkRERETkyCxcuDDRex9dVL8iE2Pn3DBgq/d+oXOu/0G6LQJa\neu/TnHNDgY+B4wu51khgJEDLli2JjY0t6vYiIiIiIkfFObe+OP2KM5WiH/An59w64F1goHPurfwd\nvPc7vfdpueWpQKRzrsH+F/Lej/fex3jvY6Kji0zaRURERESCpsjE2Ht/n/e+ufe+FXApMN17f0X+\nPs65xs45l1vunXvdpFKIV0RERESkVBzOqhQFOOduAPDevwRcBNzonMsGMoBLvfe+ZEIUERERESl9\nLlT5a0xMjNccYxERERGzZ88e4uPjyczMDHUoZVa1atVo3rw5kZGRBdqdcwu99zFFvf+IR4xFRERE\npOTEx8dTq1YtWrVqRe4MVTkM3nuSkpKIj4+ndevWR3QNbQktIiIiEgYyMzOpX7++kuIj5Jyjfv36\nRzXirsRYREREJEwoKT46R/v9KTEWERERkRIRFxfH1KlTQx3GEVNiLCIiIiIlQomxiIiIiJQbEydO\npGvXrnTr1o3hw4ezbt06Bg4cSNeuXTnjjDPYsGEDAFOmTKFz585069aN0047jaysLB566CEmT55M\n9+7dmTx5cog/yeHTqhQiIiIi4eb22yEurmSv2b07PPPMIbssW7aMxx57jB9//JEGDRqwfft2rrrq\nqn2vCRMmcOutt/Lxxx8zevRovv76a5o1a0ZycjJVqlRh9OjRxMbG8txzz5Vs7EFSsUeMV6+GrKxQ\nRyEiIiISFqZPn87FF19MgwYNAKhXrx5z587lr3/9KwDDhw9n9uzZAPTr148RI0bwyiuvkJOTE7KY\nS1LFHTHetg3atYMbb4QXXgh1NCIiIiIBRYzshoOXXnqJ+fPn88UXX9CzZ08WLlwY6pCOWsUdMd62\nzY4vvgivvhraWERERETCwMCBA5kyZQpJSUkAbN++nb59+/Luu+8C8Pbbb3PqqacCsHbtWvr06cPo\n0aOJjo5m48aN1KpVi9TU1JDFf7QqbmKcnh4oX3dd6OIQERERCROdOnXi/vvv5/TTT6dbt27ceeed\n/Pe//+X111+na9euTJo0iWeffRaAu+++my5dutC5c2f69u1Lt27dGDBgAMuXLy+zD985731IbhwT\nE+NjY2NDcm8AvvsOzjwzUA/R9yAiIiICsGLFCjp27BjqMMq8wr5H59xC731MUe+tuCPGycmhjkBE\nREREwkjFe/guIQEWL1ZiLCIiIiIFVLzE+KyzYMmSQ/fp0MHWD7zhhuDEJCIiIiIhV/GmUhSVFGdm\nwq+/QjlYckREREREiq9iJcaJiUX3SUmxY0JC6cYiIiIiImGlYiXGe/fCgw8Wfi47245KjEVEREQq\npIqVGDdsCKNH2xrG119f8FxkJIwbB//5j9XzJ8bZ2YHEWURERETKpYqVGOepXh1eeskS5fxuuw3G\nj7dyQkJgbeOOHaFOneDGKCIiIhJkycnJvPDCC4f9vqFDh5JcDlb8qpiJcZ5DbeqRmQk7d1p5zRrY\ntSs4MYmIiIiEyMES4+wi/uZ86tSp1CkHg4gVb7m2/Ira7S4hAWrXDk4sIiIiIrluvx3i4kr2mt27\nwzPPHLrPvffey9q1a+nevTuRkZFUq1aNunXrsnLlSlatWsX555/Pxo0byczM5LbbbmPkyJEAtGrV\nitjYWNLS0hgyZAinnHIKP/74I82aNeOTTz6hevXqhd7vlVdeYfz48WRlZXHccccxadIkoqKiSEhI\n4IYbbuC3334D4MUXX6Rv375MnDiRp556Cufcvi2qS1LFHjHO/cPc55JLDqxv3Bi8eERERERC6PHH\nH6dt27bExcXx5JNPsmjRIp599llWrVoFwIQJE1i4cCGxsbGMGzeOpKSkA66xevVqbr75ZpYtW0ad\nOnX44IMPDnq/Cy+8kAULFrB48WI6duzIa6+9BsCtt97K6aefzuLFi1m0aBGdOnVi2bJlPPbYY0yf\nPp3Fixfz7LPPlvjnr9gjxo89BvfdB59+CuedBzVqwHvvBc4vXgzXXBO6+ERERKRCKmpkN1h69+5N\n69at99XHjRvHRx99BMDGjRtZvXo19evXL/Ce1q1b0717dwB69uzJunXrDnr9pUuX8sADD5CcnExa\nWhpnn302ANOnT2fixIkAVKpUidq1azNx4kQuvvhiGjRoAEC9evVK7HPmqdiJsXNQsyb89a8H75P/\n7zFycqBSpdKPS0RERCQM1KhRY1955syZTJs2jblz5xIVFUX//v3JzMw84D1Vq1bdV65UqRIZGRkH\nvf6IESP4+OOP6datG2+88QYzZ84s0fgPV8WeSlGYNWtg6tRAPf+mIN26WXIsIiIiUg7VqlWL1NTU\nQs+lpKRQt25doqKiWLlyJfPmzTvq+6WmptKkSRP27NnD22+/va/9jDPO4MUXXwQgJyeHlJQUBg4c\nyJQpU/ZN39i+fftR339/Soz317YtDBlS+LllyyxxFhERESmH6tevT79+/ejcuTN33313gXODBw8m\nOzubjh07cu+993LSSScd9f0effRR+vTpQ79+/ejQocO+9meffZYZM2bQpUsXevbsyfLly+nUqRP3\n338/p59+Ot26dePOO+886vvvz/miVmYoJTExMT42NjYk9y4W5wpvf+89uPjiQN17SE2FY44JTlwi\nIiJSLq1YsYKOHTuGOowyr7Dv0Tm30HsfU9R7NWJ8MI88Yq/OnQu2L1lSsD5unC3pduWVUMiTmSIi\nIiJSNlTsh+8O5aGH7DhsGPTsGWjfPzHOW8Vi0iTbHW/cuODEJyIiIlJG3HzzzcyZM6dA22233cbV\nV18doogKV+zE2DlXCYgFNnnvh+13zgHPAkOBdGCE935RSQYaMieeCD/+CH37Wn3BAps6UauW1WvW\nDPTVg3kiIiIiB3j++edDHUKxHM5UituAFQc5NwQ4Pvc1EnjxKOMKL/mWKmHLFmjTJlCvVi1QfuEF\nqF4dLr3U6jk5Nh/59NNh797gxCoiIiIiR6RYibFzrjlwDvDqQbqcB0z0Zh5QxznXpIRiDD+JibBp\nk5X3XyokMxMmT7byxo3w/vvwww+wa1dwYxQRERGRw1LcqRTPAP8Aah3kfDMg/97J8bltW448tDDS\nujVUrWrzibduheuug+++g/R0mD374O/LvwZyenpg+oWIiIiIhJ0iR4ydc8OArd77hUd7M+fcSOdc\n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\nIAOsX2/HL78MTdwiIiIi5YAS43B20kmB8nXXwYABtpLF4sUFt49++ungxyYiIiJSzigxDmfnngsj\nR9oIcXS0tXXtWnDOMcBPPwU/NhEREZFyRsu1hbM6deDllwu2XXmlLd82cCC8/z488EBoYhMREREp\nZzRiXNYccwzceCO0bw/33x/YJCRPdnagvH59YDc9ERERETkkJcZl3dy50K1boP7ss3bctQtatYKb\nbgpJWCIiIiJljRLjsq5aNfj+extFBhg1CrwPbA7y3Xehi01ERESkDFFiXB7Urg233x6ob9oEsbFW\nPvbYQHtami33lrdBiIiIiIjso8S4vGjXDmbPtnJcHHz6qZUrVQr0Wb3aEuaBA4Mfn4iIiEiYU2Jc\nnnTtaonwuHGBUeGtWwPnd+4MlBMSghubiIiISJhTYlye1KoFvXvDt99CZCRceils2xY4v2NHoPz+\n+8GPT0RERCSMFZkYO+eqOed+cs4tds4tc849Ukif/s65FOdcXO7rodIJV4o0eLAdBw2C446DxERb\nuWLlyoKJ8cKFoYlPREREJEwVZ4OP3cBA732acy4SmO2c+9J7P2+/frO898NKPkQ5LHfeaVMq+vaF\nyZNh714rV64MTzxhfY49FpKSQhuniIiISJgpcsTYm7TcamTuy5dqVHLkataE88+Hhg2hQ4dAe3a2\nPXznHLRubYnx+PEFp1qIiIiIVGDFmmPsnKvknIsDtgLfeu/nF9Ktr3NuiXPuS+dcpxKNUo5M794F\n67Nm2TbT0dGwaBFcfz1ccIE9lLd5c2hiFBEREQkTxZlKgfc+B+junKsDfOSc6+y9X5qvyyKgZe50\ni6HAx8Dx+1/HOTcSGAnQsmXLow5eilC7dsH6smV2rF8fMjKsPH++1Z2DrKxA359+sgf4evQITqwi\nIiIiIXZYq1J475OBGcDg/dp35k238N5PBSKdcw0Kef94732M9z4mOjr6KMKWYtuwAdavL9jWIN8f\nTXa2vfbssfnIefr0gRNPDE6MIiIiImGgOKtSROeOFOOcqw4MAlbu16exc87llnvnXldPd4WDFi2g\nZUt44w0480x44AEbIS6M5huLiIhIBVacqRRNgDedc5WwhPc97/3nzrkbALz3LwEXATc657KBDOBS\n770e0AsnV11lL4BJkwrvs3EjNGoEOTnBi0tEREQkTBSZGHvvlwAHTDTNTYjzys8Bz5VsaFJqGjYs\n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\ntTbXeOlS2yTksccgMdHOPfww7NkT6ohFRETKBSXGIuHGOejZ0+YVV64cSHy7dLF1jR98ELp2hUcf\nhdGj4YMPQhuviIhIOaHEWCTcnXbagW1btthmIACzZwc3HhERkXJKibFIuLvmGrj11gPb58+345w5\nwY1HRESknFJiLFIWdOpkx5Yt4ccfrbxwoR1XrgxsBCIiIiJHTImxSFnQoYMd77kHunULtNeqBZmZ\nmk4hIiJSApQYi5QFp51mI8M33QRRUYH2G2+0Y//+tlJFu3YwdSrs3AnbtoUkVBERkbJKibFIWdG+\nfaDcpo0d77sPOne28n/+A6tXw1VX2Qhzw4bBj1FERKQM0z6zImXRjBm2tnGdOvDdd9CoETz+uJ1L\nTAxtbCIiImWURoxFyqKWLeH0063csCFcfz00b25bSjdoEOi3Z4/NQRYREZEiKTEWKQ9eesk2//js\nM7j88kD71KlQvTpMnx662ERERMoIJcYi5c2YMXDSSVYeP96On38eunhERETKCCXGIuVNjRrw739b\neepUO27eHLp4REREygglxiLl0f4rUsycCR99BEuXhiQcERGRskCJsUh51KiRHTt1gnnzIDkZLrwQ\nhg4NbVwiIiJhTImxSHlUpw588gnMmgV9+tiIMdgDeo89BsuWBfp++CG8/HJIwhQREQknznsfkhvH\nxMT42NjYkNxbpEL63/8KrlgxZw707QvOWT093VawEBERKWeccwu99zFF9StyxNg518I5N8M5t9w5\nt8w5d1shfZxzbpxzbo1zbolz7sQjDVxESsnAgQXr779vyXCeiy6Cr78ObkwiIiJhpMgRY+dcE6CJ\n936Rc64WsBA433u/PF+focAtwFCgD/Cs977Poa6rEWOREFi/Hlq1CtRr1oS0tIJ9QvS3SCIiIqWl\nxEaMvfdbvPeLcsupwAqg2X7dzgMmejMPqJObUItIOGnZEurXh7vvhiuuODApFhERqcAqH05n51wr\noAcwf79TzYCN+erxuW1bjiI2ESlpzkFiopX37oWEBDjrLHj44YLTKu66y7aYvuOO0MQpIiISAsVe\nlcI5VxP4ALjde7/zSG7mnBvpnIt1zsVu27btSC4hIiUlIgK++QZGjSrYvmEDjB0Ld94ZaNu6Febv\n/3tYRESkfClWYuyci8SS4re99x8W0mUT0CJfvXluWwHe+/He+xjvfUx0dPSRxCsipaFFvn9987aR\n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\n+F/sPWEcSDforwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x18476b92198>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize = (12, 6))\n",
    "plot = fig.add_subplot(111)\n",
    "plt.plot(np.arange(num_epochs), cost_trajectory, \"r\", label = \"cost\")\n",
    "plt.plot(np.arange(num_epochs), train_accuracy, \"b\", label = \"train_acc\")\n",
    "plt.plot(np.arange(num_epochs), test_accuracy, \"g\", label = \"test_acc\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
